import gdb

class DumpMultiArray(gdb.Command):
    """将多个浮点数数组按列对齐导出到文件"""

    def __init__(self):
        super(DumpMultiArray, self).__init__("dump_multi_array", gdb.COMMAND_DATA)

    def invoke(self, arg, from_tty):
        # 解析参数: dump_multi_array <元素数量> <文件名> <数组1> <数组2> ...
        args = gdb.string_to_argv(arg)
        if len(args) < 3:
            print("用法: dump_multi_array <元素数量> <文件名> <数组1> <数组2> ...")
            return

        try:
            length = int(args[0])
            filename = args[1]
            array_names = args[2:]
        except ValueError:
            print(f"错误: 元素数量必须是整数")
            return

        print(f"开始导出 {len(array_names)} 个数组到 {filename} (每个数组 {length} 个元素)")

        try:
            # 验证所有数组存在且长度兼容
            for arr in array_names:
                try:
                    gdb.parse_and_eval(f"{arr}[0]")  # 尝试访问第一个元素
                except Exception as e:
                    print(f"错误: 数组 '{arr}' 不存在或无法访问: {e}")
                    return

            # 写入数据
            with open(filename, 'w') as f:
                # 写入表头
                header = ",".join(array_names)
                f.write(f"{header}\n")

                # 按行写入数据
                for i in range(length):
                    row_data = []
                    for arr in array_names:
                        try:
                            value = gdb.parse_and_eval(f"{arr}[{i}]")
                            row_data.append(f"{float(value):.6f}")
                        except Exception as e:
                            row_data.append("nan")  # 出错时填充nan
                            print(f"警告: 读取 {arr}[{i}] 失败: {e}")

                    # 将当前行写入文件
                    f.write(",".join(row_data) + "\n")

            print(f"成功导出 {length} 行数据到 {filename}")

        except Exception as e:
            import traceback
            traceback.print_exc()
            print(f"导出失败: {e}")

# 注册命令
DumpMultiArray()
print("dump_multi_array 命令已加载。")
print("用法: dump_multi_array <元素数量> <文件名> <数组1> <数组2> ...")